package com.shaoyu.elasticsearch.service.fulltext;

import com.shaoyu.elasticsearch.pojo.SearchParam;
import org.elasticsearch.action.search.SearchResponse;

public interface TermSearchService {
    /**（项查询）查询包含在指定字段中指定的确切值的文档。*/
    String TERM_QUERY = "term_query";
    /**Terms Query（多项查询）查询包含任意一个在指定字段中指定的多个确切值的文档。*/
    String TERMS_QUERY = "terms_query";
    /**Range Query（范围查询）查询指定字段包含指定范围内的值（日期，数字或字符串）的文档。*/
    String RANG_QUERY = "range_query";
    /**Exists Query（存在查询）*/
    String EXISTS_QUERY = "exists_query";
    /**Prefix Query（前缀查询） 查找指定字段包含以指定的精确前缀开头的值的文档*/
    String PREFIX_QUERY = "prefix_query";
    /**
     * Wildcard Query（通配符查询）<br/>
     * 查询指定字段包含与指定模式匹配的值的文档，其中该模式支持单字符通配符（？）和多字符通配符（*）,和前缀查询一样，通配符查询指定字段是未分析的
     */
    String WILDCARD_QUERY = "wildcard_query";

    /**
     * Regexp Query（正则表达式查询）<br/>
     * 正则表达式查询的性能取决于所选的正则表达式。如果我们的正则表达式匹配许多词条，查询将很慢。一般规则是，正则表达式匹配的词条数越高，查询越慢。
     */
    String REGEXP_QUERY = "regexp_query";
    /**Fuzzy Query（模糊查询）<br/>
     * 如果指定的字段是string类型，模糊查询是基于编辑距离算法来匹配文档。编辑距离的计算基于我们提供的查询词条和被搜索文档。如果指定的字段是数值类型或者日期类型，模糊查询基于在字段值上进行加减操作来匹配文档（The fuzzy query uses similarity based on Levenshtein edit distance for string fields, and a +/-margin on numeric and date fields）。此查询很占用CPU资源，但当需要模糊匹配时它很有用，例如，当用户拼写错误时。另外我们可以在搜索词的尾部加上字符 “~” 来进行模糊查询。
     */
    String FUZZY_QUERY = "fuzzy_query";
    /**Type Query（类型查询）*/
    String TYPE_QUERY = "type_query";
    /**Ids Query（ID查询）*/
    String IDS_QUERY = "ids_query";

    /**
     * 术语查询(项级别查询)<br/>
     * 全文查询将在执行之前分析查询字符串，但是项级别查询是针对存储在反向索引中的[确切项]进行操作。<br/>
     * 通常用于结构化数据，如数字、日期和枚举，而不是全文字段。或者，在分析过程之前，它允许你绘制低级查询。
     * @param param 查询参数
     * @return
     */
    SearchResponse searchTermLevel(SearchParam param);
}
